import { Service, IUpdateResult} from 'egg';

/**
 * Users Service
 */
interface IUserWhere {
  id?: number,
  username?: string,
}
interface IUserData {
  username?: string,
  password?: string,
}
export default class Users extends Service {
  // mysql
  mysql = this.app.mysql as any;
  helper = this.ctx.helper;
  /**
   * login 输入密码与用户名或者ID => 登录失败时返回null, 成功时返回{user_id, username}
   * @param password - password
   * @param username - username
   * @param id - user_id
   */
  public async login(password: string, id?:number, username?:string) {
    if (id===undefined && username === undefined){
      throw Error('验证密码时出错，没有输入ID或者用户名')
    };
    // 限定条件
    const where = {
      id,
      username
    }
    this.helper.deleteUndefined(where);
    // 该方法会仅返回一个对象
    const user:{id:number, username: string, password: string} = await this.mysql.get('users',where);
    
    // 登录失败
    if (user === null){   
      return null;
    }
    // 登录成功
    if (this.encryptPassword(password)===user.password) {
      return {
        user_id: user.id,
        username: user.username,
      };
    }
    return null;
  }
  /**
   * update 更新用户信息，返回受影响的行数
   * @param where - 限定条件
   * @param data - 更新信息
   * @return changedRows - 更新的行数
   */ 
  public async update(data:IUserData, where:IUserWhere) {
    this.helper.deleteUndefined(where);
    this.helper.deleteUndefined(data);
    // 如果有密码则加密
    if (data.password) {
      data.password = this.encryptPassword(data.password);
    }
    // 更新
    const result:IUpdateResult = await this.mysql.update('users', data, {
      where: where,
      columns: Object.keys(data)
    });
    return result.changedRows;
  }
  /**
   * 密码加密函数
   * @param password 
   * @returns encoded_password
   */
  public encryptPassword(password:string) {
    // 待实现
    return password;
  }
  /** 
   * 检验密码是否符合规范
   * @param password
   * @return isPass
   */
  public validatePassword(password:string) {
    // 密码模板，5~24位数字字母下划线
    const pattern = /^\w{5,24}$/;
    return pattern.test(password);
  }
}
